import axios, { Canceler } from '../../src/index'

// demo1
const CancelToken = axios.CancelToken
// 注意，
// 由于source的token属性指向的同一个CancelToken的实例化对象，所以隔100ms后，第一次请求由于还未响应，于是手动取消（this.reason会有值）
// 第二次请求的cancelToken与第一次的指向一致，于是在dispatchRequest中检测不通过，抛出异常
const source = CancelToken.source()

axios.get('/cancel/get', {
  cancelToken: source.token
}).catch(function(e) {
  if (axios.isCancel(e)) {
    console.log('Request canceled', e.message)
  }
})

// 注意这里的输出顺序跟宏任务和微任务有关系
setTimeout(() => {
  source.cancel('Operation canceled by the user.')

  axios.post('/cancel/post', { a: 1 }, { cancelToken: source.token }).catch(function(e) {
    if (axios.isCancel(e)) {
      console.log(e.message)
    }
  })
}, 100)


// demo2
let cancel: Canceler
const cancelToken = new CancelToken(c => {
  cancel = c
})

axios.get('/cancel/get', {
  cancelToken: cancelToken
}).catch(function(e) {
  if (axios.isCancel(e)) {
    console.log('Request canceled')
  }
})

setTimeout(() => {
  cancel('Operation canceled by the user.')
  axios.post('/cancel/post', { a: 1 }, { cancelToken: cancelToken }).catch(function(e) {
    if (axios.isCancel(e)) {
      console.log(e.message)
    }
  })
}, 200)
